package com.tongtech.proxy.core.utils;

import java.util.Arrays;

public class BytesUtil {
//    public static boolean startWith(byte[] msg, byte[] pre) {
//        if (msg == null && pre == null) {
//            return true;
//        }
//        if (msg.length < pre.length) {
//            return false;
//        }
//        for (int i = 0; i < pre.length; ++i) {
//            if (msg[i] != pre[i]) {
//                return false;
//            }
//        }
//        return true;
//    }

    /**
     * 这段Java代码的目的是检查一个字节数组msg是否以另一个字节数组pre开头。我们可以对这段代码进行一些优化，以提高其效率和可读性。
     *
     * 首先，处理msg和pre都为null的情况。如果null是一个有效的输入，并且我们想要startWith(null, null)返回true，那么当前的逻辑是正确的。
     * 但是，如果我们认为两个null数组不应该被视为以彼此开头，那么我们需要改变这部分的逻辑。
     *
     * 对于msg和pre的长度比较，我们已经有一个正确的检查，确保msg足够长以包含pre。
     *
     * 当前的循环遍历pre的每个元素，并与msg中的对应元素进行比较。这个循环可以正常工作，但我们可以稍微改进它以提高可读性。
     *
     * 我们还可以添加一些额外的检查，例如当msg或pre为null时的情况，这取决于你想要的函数行为。
     * @param msg
     * @param pre
     * @return
     */

    public static boolean startWith(byte[] msg, byte[] pre) {
        // 如果其中一个为null，或者两者都为null但长度不等，则直接返回false
        if (msg == null || pre == null) {
            return msg == pre; // 如果两者都为null，返回true；否则返回false
        }

        // 检查msg的长度是否足够长以包含pre
        if (msg.length < pre.length) {
            return false;
        }

        // 使用Arrays.equals比较前缀部分
        return Arrays.equals(Arrays.copyOfRange(msg, 0, pre.length), pre);
    }

    /**
     * 在这个版本中，我使用了Arrays.equals方法来比较msg的前缀和pre是否相等。
     * 这通常比手动循环比较每个元素更快，因为Arrays.equals方法可能是用本地代码实现的，
     * 并且可能使用了更高效的算法。此外，Arrays.copyOfRange用于创建msg数组的前缀部分，
     * 以避免修改原始数组。
     *
     * 请注意，Arrays.equals方法在处理大型数组时可能会比手动循环更慢，
     * 因为它需要复制数组的一部分。然而，对于大多数情况，使用Arrays.equals应该是一个合理的选择，
     * 因为它提高了代码的可读性和维护性。如果你正在处理非常大的数组，并且性能是一个关键问题，
     * 那么你可能需要回到手动循环的方法，并考虑其他优化策略，比如使用System.arraycopy来避免不必要的对象创建。
     */
}
